package com.ksyun.whgc.heruiming.work1;

import java.util.*;

//1.编写字符串工具类实现下如下四个方法，方法接收字符串参数并实现如下目标：
//        1.1 反转字符串参数，并作为方法结果返回(10分)
//        1.2 统计字符串中每个字母出现的次数，以Map结构返回（10分）
//        1.3 打印出现次数最多的字母及其次数（10分）
//        1.4 返回不含有重复字符的最长子串（20分）
public class work01 {

    public static class StringTool {

        /**
         * 反转字符串参数
         * abcd dcba   3/2=1.5=1   4/2=2
         * 实现思路：直接对传进来的字符串进行操作，前后指针的方式，相互调换位置。
         */
        public static String reverse(String str) {
            if (str == null || str.trim().isEmpty()) {
                return str;
            }
            StringBuilder sb = new StringBuilder(str);
            int j = sb.length() - 1;
            for (int i = 0; i < sb.length() / 2; i++) {
                char temp = sb.charAt(i);
                sb.setCharAt(i, sb.charAt(j));
                sb.setCharAt(j--, temp);
            }
            return sb.toString();
        }

        /**
         * 统计字符串中每个字母出现的次数，以Map结构返回
         */
        public static Map<Character, Integer> CountOccurNumberOfChar(String str) {
            if (str == null || str.trim().isEmpty()) {
                return Collections.emptyMap();
            }
            Map<Character, Integer> target = new HashMap<>();
            char[] chars = str.toCharArray();
            for (char item : chars) {
                if (Character.isLetter(item)) {
                    target.put(item, target.getOrDefault(item, 0) + 1);
                }
            }
            return target;
        }


        /**
         * 打印出现次数最多的字母及其次数
         */
        public static void printMostCharWithNum(String str) {
            if (str == null || str.trim().length() == 0) {
                return;
            }
            HashMap<Character, Integer> target = new HashMap<>();
            char[] chars = str.toCharArray();
            char targetC = chars[0];
            int num = 1;
            for (char item : chars) {
                int value = target.compute(item, (k, v) -> (v == null) ? 1 : v + 1);
                if (value > num) {
                    num = value;
                    targetC = item;
                }
            }
            System.out.println("出现次数最多的字母是:" + targetC + "--出现次数为：" + num + "次");
        }


        /**
         * 返回不含有重复字符的最长子串
         */
        public static String longestSubstringWithoutRepeat(String str) {
            if(str==null){
                return null;
            }
            HashMap<Character, Integer> map = new HashMap<>();
            int start=0;
            int max=0;
            char[] chars = new char[str.length()];
            for(int i=0;i<str.length();i++){
                char c = str.charAt(i);
                int index=max;
                if(!map.containsKey(c)){
                    map.put(c,i);
                }else{
                    start=Math.max(start,map.get(c)+1);
                    map.put(c,i);
                }
                max=Math.max(max,i-start+1);
                if(index!=max){
                    chars = new char[max];
                    int j=0;
                    for(int k=start;k<=i;k++){
                        chars[j++]=str.charAt(k);
                    }
                }
            }
            return new String(chars).trim();
        }
    }

    /**
     * 字符串反转测试方法
     */
    public static void test01() {
        System.out.println("-----------------字符串反转-----------------");
        System.out.println(StringTool.reverse("rfgtgeqrgqregsrgrg"));
        System.out.println(StringTool.reverse("abcd"));
        System.out.println(StringTool.reverse("aabbbb"));
        System.out.println(StringTool.reverse(""));
        System.out.println(StringTool.reverse("gbrtbtr"));
        System.out.println(StringTool.reverse("abceeeeeeeeeeeeett"));
        System.out.println("----------------------------------------------\n\n\n");

    }

    public static void test02() {
        System.out.println("-----------------字符串中每个字母出现的次数-----------------");
        System.out.println(StringTool.CountOccurNumberOfChar("rfgtgeqrgqregsrgrg"));
        System.out.println(StringTool.CountOccurNumberOfChar("abcd"));
        System.out.println(StringTool.CountOccurNumberOfChar("aabbbb"));
        System.out.println(StringTool.CountOccurNumberOfChar(""));
        System.out.println(StringTool.CountOccurNumberOfChar("gbrtbtr"));
        System.out.println(StringTool.CountOccurNumberOfChar("abceeeeeeeett"));
        System.out.println("----------------------------------------------\n\n\n");
    }

    public static void test03() {
        System.out.println("-----------------出现次数最多的字母及其次数-----------------");
        StringTool.printMostCharWithNum("rfgtgeqrgqregsrgrg");
        StringTool.printMostCharWithNum("abcd");
        StringTool.printMostCharWithNum("aabbbb");
        StringTool.printMostCharWithNum("");
        StringTool.printMostCharWithNum("gbrtbtr");
        StringTool.printMostCharWithNum("abceeeeeett");
        System.out.println("----------------------------------------------\n\n\n");

    }

    public static void test04(){
        System.out.println("-----------------测试返回不含有重复字符的最长子串\n-----------------");
        System.out.println(StringTool.longestSubstringWithoutRepeat("rfggrg"));
        System.out.println(StringTool.longestSubstringWithoutRepeat("abcd"));
        System.out.println(StringTool.longestSubstringWithoutRepeat("aabbbb"));

        System.out.println(StringTool.longestSubstringWithoutRepeat("dvdf"));
        System.out.println(StringTool.longestSubstringWithoutRepeat("gbrtbt"));
        System.out.println(StringTool.longestSubstringWithoutRepeat("abceee"));
        System.out.println("----------------------------------------------\n\n\n");
    }


    public static void main(String[] args) {
        test01();
        test02();
        test03();
        test04();
    }
}
